
package com.scott.itcast.condition;

/**
 * 子线程循环10次，接着主线程循环100次
 * 接着又回到子线程循环10次，接着再回到主线程循环100次
 * 如此循环50次。请写出程序
 */
public class TraditionalThreadCommunication {

	public static void main(String[] args) {
		
		
		final TraditionalThreadCommunication.Business business = new TraditionalThreadCommunication().new Business();
		//第1个线程
		new Thread(new Runnable(){
			public void run() {
				for(int i=1;i<=50;i++){
					business.sub(i);
				}
			}
			
		}).start();
		
		//第2个线程
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
		

	}
	
	class Business{
		
		private boolean flag = true;
		
		
		public synchronized void sub(int i){
			
			//使用while可以消除 伪唤醒  spurious wakeup
			while(!flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for(int j=1; j<=10; j++){
				//System.out.println("子线程" + j + " loop of "+i);
				System.out.println("子线程["+Thread.currentThread().getName()+ "]。外层循环次数：[" + i + "]。内存循环次数：["+j+"]");
			}
			System.out.println();
			
			flag=false;
			
			//唤醒main线程
			this.notify();
			
			
		}

		public synchronized void main(int i){
			
			//使用while可以消除 伪唤醒  spurious wakeup
			while(flag){
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for(int j=1; j<=100; j++){
				System.out.println("主线程["+Thread.currentThread().getName()+ "]。外层循环次数：[" + i + "]。内存循环次数：["+j+"]");
			}
			System.out.println();
			flag=true;
			
			//唤醒sub线程
			this.notify();
		}
	}

}

